package com.papercutting.platform.service;

import com.papercutting.platform.dto.query.UserQuery;
import com.papercutting.platform.dto.request.UserCreateRequest;
import com.papercutting.platform.dto.request.UserUpdateRequest;
import com.papercutting.platform.dto.response.PageResult;
import com.papercutting.platform.dto.response.UserResponse;
import com.papercutting.platform.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Map;

/**
 * 用户服务接口
 */
public interface UserService {
    
    /**
     * 创建用户
     */
    Long createUser(UserCreateRequest request);
    
    /**
     * 更新用户
     */
    void updateUser(UserUpdateRequest request);
    
    /**
     * 根据ID删除用户
     */
    void deleteUser(Long id);
    
    /**
     * 批量删除用户
     */
    void batchDeleteUsers(List<Long> userIds);
    
    /**
     * 根据ID查找用户
     */
    UserResponse getUserById(Long id);
    
    /**
     * 分页查询用户列表
     */
    PageResult<UserResponse> getUserPage(UserQuery query);
    
    /**
     * 获取用户列表（不分页）
     */
    List<UserResponse> getUserList(UserQuery query);
    
    /**
     * 更新用户状态
     */
    void updateUserStatus(Long id, Integer status);
    
    /**
     * 批量更新用户状态
     */
    void batchUpdateUserStatus(List<Long> userIds, Integer status);
    
    /**
     * 重置用户密码
     */
    void resetPassword(Long id, String newPassword);
    
    /**
     * 用户登录验证
     */
    UserResponse authenticate(String username, String password);
    
    /**
     * 根据OpenId查找用户
     */
    User findByOpenId(String openId);
    
    /**
     * 根据手机号查找用户
     */
    User findByPhone(String phone);
    
    /**
     * 根据邮箱查找用户
     */
    User findByEmail(String email);
    
    /**
     * 检查用户名是否存在
     */
    boolean existsByNickname(String nickname);
    
    /**
     * 检查手机号是否存在
     */
    boolean existsByPhone(String phone);
    
    /**
     * 检查邮箱是否存在
     */
    boolean existsByEmail(String email);
    
    /**
     * 获取用户统计信息
     */
    Map<String, Object> getUserStats();
    
    /**
     * 获取用户总数
     */
    Long getUserCount();
    
    /**
     * 根据用户名查找用户
     */
    User findByNickname(String nickname);
    
    /**
     * 根据ID查找用户（返回实体）
     */
    User findById(Long id);
    
    /**
     * 保存用户
     */
    User save(User user);
    
    /**
     * 根据ID删除用户
     */
    void deleteById(Long id);
    
    /**
     * 分页查询用户列表（带搜索条件）
     */
    Page<User> findUserList(String keyword, Integer userType, Pageable pageable);
}